使用 Python 循环执行 SPSS 命令
作者:Ruben Geert van den Berg,归属于 SPSS Python 基础
SPSS 的一个恼人限制是某些命令一次只能处理一个变量。虽然 DO REPEAT
和 LOOP
允许我们循环处理变量,但它们仅限于 SPSS 的转换命令。
然而,Python 允许我们循环执行_任何_命令。最重要的是,我们可以使用 TO
关键字,从而避免拼写出所有变量名。
本课程涵盖这两种技术,是本系列课程中最重要的部分之一。让我们开始吧!
人口金字塔
之前我们清理了一些反应时间数据,得到了 trials-renamed.sav 文件,部分数据如下所示。
现在,我们想可视化女性和男性参与者的表现。创建人口金字塔是一个很好的方法。它们可以让我们“快速且粗略地”比较:
等等,在男性和女性之间。首先,我们按照下面的截图创建一个人口金字塔。
SPSS 人口金字塔语法
粘贴后的人口金字塔语法如下:
XGRAPH CHART=[HISTOBAR] BY time_1[s] BY gender[c]
/COORDINATE SPLIT=YES
/BIN START=AUTO SIZE=AUTO
/TITLES TITLE='Reaction Time by Gender'.
显然,一个人口金字塔需要 4 行语法,而我们想要快速查看 20 个金字塔。诚然,我们可以稍微缩短语法,但没必要浪费时间。所以我们至少需要 80 行 语法,对吗?
扩展 SPSS 的 TO 关键字
不对。和之前的课程一样,我们将使用 Python 循环执行此命令,并在每次迭代中使用不同的变量名。在本例中,我们的反应时间变量的名称非常简单,我们可以使用 Python 列表推导式生成所有变量名,如 ["time_%s"%ind for ind in range(1,21)]
。但如果变量名不遵循如此简单的模式呢?在 SPSS 中,我们通常使用 SPSS 的 TO
关键字指定一个变量块,该关键字用作第一个和最后一个变量名之间的分隔符。可以添加额外的变量,用空格分隔,例如 time_1 time_3 **to** time_6 time_8 time_12
。Python 可以将这个 SPSS 变量规范扩展为一个 Python 变量名列表。这是最重要的 SPSS Python 技术之一,如下所示:
使用 TO 关键字检索变量块
begin program python3.import spssaux
= spssaux.VariableDict(caseless = True)
sDict = sDict.expand("tiME_1 to time_20")
varList print(varList)
end program.
注意:由于 Python 区分大小写,我们通常需要使用变量名和任何其他 SPSS 对象(SPSS objects)的正确大小写。但是,对于 VariableDict()
,添加 caseless = True
允许我们使用任何喜欢的大小写,通常是全部小写。
运行人口金字塔
我们现在可以使用一个简单的 Python for
循环来迭代我们的 XGRAPH
命令。在每次迭代中,Python 将 %s
替换为变量名。这将完成我们的工作。
对变量块运行人口金字塔
begin program python3.import spssaux,spss
= spssaux.VariableDict(caseless = True)
sDict = sDict.expand("time_1 to time_20")
varList for var in varList:
'''
spss.Submit( XGRAPH CHART=[HISTOBAR] BY %s[s] BY gender[c]
/COORDINATE SPLIT=YES
/BIN START=AUTO SIZE=AUTO
/TITLES TITLE='Reaction Time by Gender'.
'''%var)
end program.
结果
将变量标签插入到标题中
我们已经完成了基本工作。但是,我们现在将变量标签插入到图表标题中。spss.GetVariableLabel()
可以通过变量_索引_ (variable indices) 检索变量标签。但是,要通过变量_名称_ (variable names) 获取变量标签,上述 VariableDict()
对象会派上用场(下面的第 8 行)。 在我们的最后一个例子中,我们在每个 XGRAPH
命令中有两个文本替换。当使用多个文本替换时,使用 locals()
通常是一种很好的方法。
使用 locals() 进行文本替换,并将变量标签放入标题中
begin program python3.import spssaux,spss
= spssaux.VariableDict(caseless = True)
sDict = sDict.expand("time_1 to time_20")
varList for var in varList:
= sDict[var].VariableLabel
varLab '''
spss.Submit( XGRAPH CHART=[HISTOBAR] BY %(var)s[s] BY gender[c]
/COORDINATE SPLIT=YES
/BIN START=AUTO SIZE=AUTO
/TITLES TITLE='%(varLab)s by Gender'.
'''%locals())
end program.